<?php
/**
 * raw.libaray.php
 * @Copyright lemonCarlJ All rights reserved.
 * @License http://www.56code.com/License.txt
 * @Version 1.0.0
 * @Email rpgshifa@aliyun.com
 */
namespace SF\libaray;

class raw
{
    /**
     * 创建目录
     * @param string $directory 目录地址
     * @param int $mode 目录权限 [ 0755 ]
     * @return boolean 返回是否创建成功
     */
    static public function create_directory( $directory, $mode = 0755 )
    {
        return mkdir( $directory, $mode, true );
    }
    
    /**
     * 删除目录
     * @param string $directory 删除的目录
     * @param boolean $recursive 是否递归删除
     * @return boolean 返回是否删除成功
     */
    static public function delete_directory( $directory, $recursive = false )
    {
        if( $recursive )
        {
        	$directory_list = $this->directory_list( $directory );
        	if( !empty( $directory_list ) )
        	{
        		foreach ( $directory_list as $file_name )
        		{
        			$file = $directory . DIRECTORY_SEPARATOR . $file_name;
        			if( is_dir( $file ) )
        			{
        				self::delete_directory( $file, true );
        			}else{
        			    self::delete_file( $file );
        			}
        		}
        	}
        }
        
        return rmdir( $directory );
    }
    
    /**
     * 复制目录
     * @param string $directory 复制的目录
     * @param string $copy_directory 复制到目标目录
     * @param boolean $replace 是否替换原有文件
     */
    static public function copy_directory( $directory, $copy_directory, $replace = false )
    {
        $directory_list = self::directory_list( $directory );
        
        if( !file_exists( $copy_directory ) )
        {
            self::create_directory( $copy_directory );
        }
        
        if( !empty( $directory_list ) )
        {
            foreach ( $directory_list as $file_name )
            {
                $file = $directory . DIRECTORY_SEPARATOR . $file_name;
                $copy_file = $copy_directory . DIRECTORY_SEPARATOR . $file_name;
                if( is_dir( $file ) )
                {
                    self::copy_directory( $file, $copy_file );
                }else{
                    if( !file_exists( $copy_file ) || $replace )
                    {
                        if( self::create_file( $copy_file, 'wb' ) )
                        {
                            if( $content = self::read_file( $file ) )
                            {
                                self::write_file( $copy_file, $content );
                            }
                        }
                    }
                }
            }
        }
    }
    
    /**
     * 移动目录
     * @param string $directory 目录地址
     * @param string $new_directory 移动的目标目录
     * @return boolean 反正是否移动成功
     */
    static public function move_directory( $directory, $move_directory )
    {
        $move_directory .= DIRECTORY_SEPARATOR . basename( $move_directory );
        return rename( $directory, $move_directory );
    }
    
    /**
     * 重命名目录
     * @param string $directory 目录地址
     * @param string $new_name 重命名
     * @return boolean 返回是否重命名成功
     */
    static public function rename_directory( $directory, $new_name )
    {
    	$new_directory = realpath( $directory . DIRECTORY_SEPARATOR . '..' ) . DIRECTORY_SEPARATOR . $new_name;
    	return self::move_directory( $directory, $new_directory );
    }
    
    /**
     * 获取目录列表
     * @param string $directory 目录地址
     * @return array 返回目录列表
     */
    static public function directory_list( $directory )
    {
    	$directory_list = array();
    	
    	$handle = opendir( $directory );
    	while( $file_name = readdir( $handle ) )
    	{
    		if( $file_name !== '.' && $file_name != '..' )
    		{
    			$directory_list[] = $file_name;
    		}
    	}
    	
    	closedir( $handle );
    	
    	return $directory_list;
    }
    
    /**
     * 新建文件
     * @param string $file_path 文件路径
     * @param string $mode 创建模式 [ x ]
     * @return boolean 返回创建失败或者新文件文件资源句柄
     */
    static public function create_file( $file_path, $mode = 'x' )
    {
        return fopen( $file_path, $mode );
    }
    
    /**
     * 读取文件
     * @param string $file_path 文件路径
     * @param string|int 读取文件内容大小 [ 0 ]
     * @return string|false 返回读取内容或者读取失败
     */
    static public function read_file( $file_path, $read_size = 0 )
    {
    	$handle = self::create_file( $file_path, 'r' );
    	
    	if( $handle )
    	{
    	    if( $read_size !== 0 )
    	    {
    	        $read_size = self::file_size_convert( $read_size, 'B' );
    	    }else{
    	        $read_size = filesize( $file_path );
    	    }
    	    
    	    if( $read_size < 1 )
    	    {
    	        $read_size = 1;
    	    }
    	    
    	    if( flock( $handle, LOCK_SH ) )
    	    {
    	        $content = fread( $handle, $read_size );
    	        flock( $handle, LOCK_UN );
    	        fclose( $handle );
    	    }
    	    
    	    return $content;
    	}
    	
    	return false;
    }
    
    /**
     * 写入文件
     * @param string $file_path 文件路径
     * @param string $content 写入内容
     * @param boolean $cover 是否覆盖内容
     * @return boolean 返回写入状态
     */
    static public function write_file( $file_path, $content, $cover = true )
    {
        //是否写入
        $is_write = false;
        
        if( file_exists( $file_path ) )
        {
            $handle = self::create_file( $file_path, $cover ? 'wb' : 'a' );
            if( $handle )
            {
                if( flock( $handle, LOCK_EX ) )
                {
                    if( fwrite( $handle, $content ) )
                    {
                        $is_write = true;
                    }
                    flock( $handle, LOCK_UN );
                    fclose( $handle );
                }
            }
        }
        
        return $is_write;
    }
    
    /**
     * 删除文件
     * @param string $file_path 文件路径
     * @return boolean 返回是否删除成功
     */
    static public function delete_file( $file_path )
    {
    	return unlink( $file_path );
    }
    
    /**
     * 文件重命名
     * @param string $file_path 文件路径
     * @param string $new_name 新文件名
     * @return boolean 返回是否重命名成功
     */
    static public function rename_file( $file_path, $new_name )
    {
        $new_file_path = dirname( $file_path ) . DIRECTORY_SEPARATOR . $new_name . self::file_extension( $file_path );
        return self::move_file( $file_path, $new_directory );
    }
    
    /**
     * 移动文件
     * @param string $file_path 文件路径
     * @param string $move_directory 移动到的目标目录
     * @return boolean 返回是否移动成功
     */
    static public function move_file( $file_path, $move_directory )
    {
        $new_file_path = realpath( $move_directory ) . DIRECTORY_SEPARATOR . basename( $file_path );
        if( !file_exists( $new_file_path ) )
        {
            return rename( $file_path, $new_file_path );
        }
        return false;
    }
    
    /**
     * 复制文件
     * @param string $file_path 文件路径
     * @param string $copy_directory 复制到的目标目录
     * @return boolean 返回是否复制成功
     */
    static public function copy_file( $file_path, $copy_directory )
    {
        $new_file_path = realpath( $copy_directory ) . DIRECTORY_SEPARATOR . basename( $file_path );
        if( !file_exists( $new_file_path ) )
        {
            //读取源文件内容
            $content = self::read_file( $file_path );
            
            //写入内容
            return self::write_file( $new_file_path, $content );
        }
        
        return false;
    }
    
    /**
     * 获取文件字节大小
     * @param string $file_path 文件路径
     * @param string $byte 文件字节单位 [ B ]
     * @param number $reserve 保留返回大小的小数位
     * @return number|boolean 返回大小或者是否获取成功
     */
    static public function file_size( $file_path, $byte = 'B', $reserve = 0 )
    {
        return self::file_size_convert( filesize( $file_path ), $byte, $reserve );
    }
    
    /**
     * 转换字节类型
     * @param string|int $filesize 文件大小
     * @param string $convert 转换类型
     * @param number $reserve 保留返回大小的小数位
     * @return number 转换后对应字节的文件大小
     */
    static public function file_size_convert( $filesize, $convert = 'B', $reserve = 0  )
    {
        //获取字节单位
        $byte = 'B';
        if( is_string( $filesize ) )
        {
            $byte = substr( $filesize, -1 );
            $filesize = intval( substr( $filesize, 0, -1) );
        }
        
        $byte_list = 'BKMGTP';
        
        //字节类型分析
        $byte_pos = strpos( $byte_list, $byte );
        $convert_pos = strpos( $byte_list, $convert );
        
        //相同字节类型
        if( $byte_pos === $convert_pos )
        {
            return $filesize;
        }
        
        //差异字节类型
        $differ = $byte_pos - $convert_pos;
        $count = abs( $differ );
        for ( $i = 0 ; $i < $count ; $i ++ )
        {
            if( $differ > 0 )
            {
                $filesize *= 1024;
            }else{
                $filesize /= 1024;
            }
        }
        
        if( $reserve )
        {
            $filesize = round( $filesize, $reserve );
        }
        
        return $filesize;
    }
    
    /**
     * 获取文件名
     * @param string $file_path 文件路径
     * @return string 返回文件名
     */
    static public function file_name( $file_path )
    {
        $path_info = pathinfo( $file_path );
        return $path_info[ 'filename' ];
    }
    
    /**
     * 获取文件后缀
     * @param string $file_path 文件路径
     * @return string 返回文件后缀或者空
     */
    static public function file_extension( $file_path )
    {
        $path_info = pathinfo( $file_path );
        return isset( $path_info[ 'extension' ] ) ? $path_info[ 'extension' ] : '';
    }
    
    /**
     * 返回文件最后访问时间
     * @param string $file_path 文件路径
     * @return number 返回访问时间戳
     */
    static public function file_access_time( $file_path )
    {
        return fileatime( $file_path );
    }
    
    /**
     * 返回文件最后修改时间
     * @param string $file_path 文件路径
     * @return number 返回修改时间戳
     */
    static public function file_modify_time( $file_path )
    {
        return filemtime( $file_path );
    }
    
    /**
     * 返回文件最后变化时间
     * @param string $file_path 文件路径
     * @return number 返回变化时间戳
     */
    static public function file_change_time( $file_path )
    {
        return filectime( $file_path );
    }
}